package com.ysyx.ysyx_earlytrack.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ysyx.ysyx_earlytrack.dto.BaseDto;
import com.ysyx.ysyx_earlytrack.mapper.TrackPojoMapper;
import com.ysyx.ysyx_earlytrack.pojo.TrackPojo;
import com.ysyx.ysyx_earlytrack.qo.GeoQo;
import com.ysyx.ysyx_earlytrack.service.TrackService;
import org.redisson.api.GeoPosition;
import org.redisson.api.RGeo;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * Created by IntelliJ IDEA.
 *
 * @description: xxxx接口/类
 * @author:薛宇晖
 * @create:2023/4/13 10:55
 */
@Service
public class TrackServiceImpl implements TrackService {

    @Autowired
    private RedissonClient redissonClient;

    @Autowired
    private TrackPojoMapper trackPojoMapper;
    @Override
    public BaseDto getDriverGeo(String orderId) {

//        乘客获取司机定位 订单状态码(订单状态码，注意非接口业务状态码)
//        乘客下单成功，等待系统派单	101
//        订单长时间没有司机接单,乘客取消订单	201
//        订单第一次过期，系统强制派单	202
//        订单第一次过期，系统强制派单失败（附近没有司机）	203
//
//        订单已分配司机，司机前往起点中	301
//        司机前往起点，乘客取消订单	302
//        司机前往起点，司机取消订单	303
//        司机前往起点时间过长	304
//
//        司机到达起点，等待乘客	401
//        司机到达起点，乘客长时间不上车/规定时间没有确认后四位	402
//        司机到达起点，确认乘客成功，开始行程	403
//
//        订单行程中(已废弃，请使用403)	501
//        订单行程中，订单被乘客取消	502
//        订单行程中，订单被司机取消	503
//        订单行程中，乘客重新选择终点	504
//        订单行程中，司机没有按照导航行驶	505
//        订单行程中，司机多次没有按照导航行驶	506
//        订单行程中，司机多次没有按照导航行驶，平台介入	507
//
//        司机到达终点，点击完成订单，行程结束，订单未被支付	601
//        司机到达终点，长时间没有点击完成订单	602
//        行程结束，订单被支付	603

//        BaseDto baseDto = new BaseDto();

        RMap<Object, Object> map = redissonClient.getMap("orderinfo:" + orderId);
        String driverId = (String) map.get("driverId");
        String orderStatus = (String) map.get("orderStatus");

        System.out.println("当前订单状态==="+orderStatus);

        //乘客下单成功，等待系统派单	101
        if (orderStatus.equals(String.valueOf(101))){
            return new BaseDto(101,"等待系统派单",null);
        }else if (orderStatus.equals(String.valueOf(301))){
            //订单已分配司机，司机前往起点中	301
            //去获取司机的位置信息
            RGeo<String> geo = redissonClient.getGeo("order:track:" + orderId);
            //获取到司机id
//            String name = "";
//            for (String o : geo) {
//                name = o;
//            }
            Object[] objects = geo.toArray();
            String name  = (String) objects[objects.length-1];

            //获取到一个map    k 时间戳     v经纬度
            Map<String, GeoPosition> pos = geo.pos(name);
            System.out.println(pos);
            double latitude = pos.get(name).getLatitude();
            double longitude = pos.get(name).getLongitude();
            GeoQo qo = new GeoQo(longitude,latitude,Integer.valueOf(driverId));
            List<GeoQo> list = new ArrayList<>();
            list.add(qo);
            return new BaseDto(301,"司机前往起点中",list);
        }else if (orderStatus.equals(String.valueOf(403))){
            //去获取司机的位置信息
            RGeo<String> geo = redissonClient.getGeo("order:track:" + orderId);
            //获取到司机id
//            String name = "";
//            for (String o : geo) {
//                name = o;
//            }
            Object[] objects = geo.toArray();
            String name  = (String) objects[objects.length-1];


            //获取到一个map    k 时间戳     v经纬度
            Map<String, GeoPosition> pos = geo.pos(name);
            double latitude = pos.get(name).getLatitude();
            double longitude = pos.get(name).getLongitude();


            GeoQo qo = new GeoQo(longitude,latitude,Integer.valueOf(driverId));
            List<GeoQo> list = new ArrayList<>();
            list.add(qo);

            return new BaseDto(401,"司机确认乘客成功，当前为行程中",list);
        }else  if (orderStatus.equals(String.valueOf(601))){

            return new BaseDto(601,"司机到达终点，点击完成订单，行程结束，订单未被支付",null);
        }else if(orderStatus.equals(String.valueOf(603))){
            return new BaseDto(603,"行程结束，订单被支付",null);
        } else if (orderStatus.equals(String.valueOf(303))) {
            return new BaseDto(303,"订单已被司机取消",null);
        }
        return new BaseDto(0,"系统错误",null);
        // 获取订单状态码




//        //去获取司机的位置信息
//        RGeo<String> geo = redissonClient.getGeo("order:track:" + orderId);
//
//        //获取到司机id
//        String name = "";
//        for (String o : geo) {
//            name = o;
//        }
//        //获取到一个map    k 时间戳     v经纬度
//        Map<String, GeoPosition> pos = geo.pos(name);
//        double latitude = pos.get(name).getLatitude();
//        double longitude = pos.get(name).getLongitude();
//
//
//        GeoQo qo = new GeoQo(longitude,latitude,Integer.valueOf(driverId));
//        List<GeoQo> list = new ArrayList<>();
//        list.add(qo);
//        baseDto = new BaseDto(101,"获取司机定位成功",list);
//        return baseDto;
    }

    /*
     * @Description: (作用) 实现查询订单轨迹list
     * @params: orderId
     * @return:
     * @Author: 薛宇晖
     * @create:2023/4/13
     */
    @Override
    public BaseDto queryHistoryTrack(String orderId) {
        //轨迹的key
        String key = "order:track:"+orderId;

        BaseDto baseDto = new BaseDto();

        RGeo<Object> geo = redissonClient.getGeo(key);
        List<TrackPojo> list = new ArrayList<>();

        Collection<Object> objects = geo.readAll();
        for (Object object : objects) {
            GeoPosition geoPosition = geo.pos(object).get(object);
            TrackPojo pojo = new TrackPojo(null,orderId,geoPosition.getLongitude(), geoPosition.getLatitude(),new Date(Long.parseLong((String) object)));
            list.add(pojo);
        }


        // 如果redis中不存在此订单轨迹list
        if (list.size()==0){
            QueryWrapper queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("order_id",orderId);
            list = trackPojoMapper.selectList(queryWrapper);

            if (list.size()==0){
                baseDto = new BaseDto(103,"数据丢失",list);
                return baseDto;
            }

            //查询到这个订单的list
            baseDto = new BaseDto(102,"在数据库里面拿到的",list);
            return baseDto;
        }

        baseDto = new BaseDto(101,"从redis拿到的",list);

        return baseDto;
    }
}
